'''
Created on 10/ott/2011

@author: Ivan
'''
import wx  
import wx.lib.ogl as ogl  
      
class Prova(wx.Frame):  
        def __init__(self, *a, **k):  
            wx.Frame.__init__(self, *a, **k)  
            p = wx.Panel(self)  
            agg_q = wx.Button(p, -1, 'agg. quadrato')  
            agg_c = wx.Button(p, -1, 'agg. cerchio')  
            canc = wx.Button(p, -1, 'cancella')  
            # ------ la parte importante:  
            # ogni canvas ha un diagramma, devono essere collegati tra loro,   
            # e si usano entrambi a seconda delle occasioni...  
            self.canvas = ogl.ShapeCanvas(p)  
            self.diag = ogl.Diagram()  
            self.diag.SetCanvas(self.canvas)  
            self.canvas.SetDiagram(self.diag)  
            # -------  
            s = wx.BoxSizer(wx.VERTICAL)  
            for b in (agg_q, agg_c, canc):  
                s.Add(b, 0, wx.EXPAND|wx.ALL, 5)  
            s1 = wx.BoxSizer()  
            s1.Add(s, 0, wx.EXPAND, 0)  
            s1.Add(self.canvas, 1, wx.EXPAND|wx.ALL, 5)  
            p.SetSizer(s1)  
              
            self.Bind(wx.EVT_BUTTON, self.su_agg_q, agg_q)  
            self.Bind(wx.EVT_BUTTON, self.su_agg_c, agg_c)  
            self.Bind(wx.EVT_BUTTON, self.su_canc, canc)  
      
        def su_agg_q(self, evt): # aggiunge un quadrato  
            q = ogl.RectangleShape(50.0, 50.0)  
            self.aggiungi_forma(q)  
          
        def su_agg_c(self, evt):  # aggiunge un cerchio  
            c = ogl.CircleShape(50.0)  
            self.aggiungi_forma(c)  
              
        def su_canc(self, evt):  # se qualcosa e' selezionato, lo elimina  
            for shape in self.diag.GetShapeList():  
                if shape.Selected():   
                    shape.Select(False)  
                    self.canvas.RemoveShape(shape)  
            self.canvas.Refresh(False)  
          
        def aggiungi_forma(self, forma):  
            # una funzione di convenienza, solo per non ripetere due volte  
            # questo codice (in su_agg_q e su_agg_c)  
            forma.SetX(60.0)  
            forma.SetY(60.0)  
            self.canvas.AddShape(forma)  
            # ---- collego la forma appena creata al gestore degli eventi  
            # in questo modo  
            evthandler = MyEvtHandler()  
            evthandler.SetShape(forma)  
            evthandler.SetPreviousHandler(forma.GetEventHandler())  
            forma.SetEventHandler(evthandler)  
            # ------  
            forma.Show(True)  
            self.canvas.Refresh(False)  
      
class MyEvtHandler(ogl.ShapeEvtHandler):  
        # il gestore degli eventi per le forme che creo  
        def __init__(self):  
            ogl.ShapeEvtHandler.__init__(self)  
      
        def OnLeftClick(self, x, y, keys=0, attachment=0):  
            shape = self.GetShape()  
            canvas = shape.GetCanvas()  
            diag = canvas.GetDiagram()  
            # seleziono / deseleziono la forma  
            if shape.Selected():  
                shape.Select(False)  
            else:  
                # deseleziono qualsiasi altra cosa...   
                for s in diag.GetShapeList():   
                    s.Select(False)  
                # ...e seleziono la forma cliccata  
                shape.Select(True)  
            canvas.Refresh(False)  
      
        def OnRightClick(self, x, y, keys=0, attachment=0):  
            shape = self.GetShape()  
            canvas = shape.GetCanvas()  
            # alterno tra bianco e rosso  
            col = shape.GetBrush().GetColour()  
            if col == wx.NamedColour('WHITE'):  
                shape.SetBrush(wx.Brush('RED'))  
            else:  
                shape.SetBrush(wx.Brush('WHITE'))  
            canvas.Refresh(False)  
          
if __name__ == '__main__':  
        app = wx.App(False)  
        ogl.OGLInitialize() # <---- MAI DIMENTICARE QUESTO!!  
        Prova(None, -1, 'OGL demo').Show()  
        app.MainLoop()  